﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
using System.Globalization;
using System.Windows.Forms;
using Autofac;
using ComputerVision.BaseForm;
using ComputerVision.Common;
using ComputerVision.Data;
using ComputerVision.Services;
using RawInput_dll;

namespace ComputerVision
{
    public partial class frmConfigCamera : frmObject
    {
        #region Camera Capture Variables
        //private bool _captureInProgress; //Variable to track camera state
        private int CameraDevice = 0; //Variable to track camera device selected
        private readonly RawInput _rawinput;

        #endregion

        private readonly IService<ConfigrationCamera> _configCameraService;
        private string _computerName;

        public frmConfigCamera()
        {
            InitializeComponent();

            _rawinput = new RawInput(Handle);
            _computerName = Environment.MachineName;
            _configCameraService = Program.Container.Resolve<IService<ConfigrationCamera>>();

            LoadCardReader();
            LoadDrivers();
        }
        
        private void btnClose_Click(object sender, EventArgs e)
        {
            Close();
        }

        #region Validation

        protected bool Validator()
        {
            if (string.IsNullOrEmpty(txtServer.Text))
            {
                AlertList.Error("Bạn phải nhập Webcam server trước.");
                return false;
            }

            if (string.IsNullOrEmpty(txtuserId.Text))
            {
                AlertList.Error("Bạn phải nhập UserID.");
                return false;
            }

            if (string.IsNullOrEmpty(txtPassword.Text))
            {
                AlertList.Error("Bạn phải nhập Password trước.");
                return false;
            }

            int result;

            if (string.IsNullOrEmpty(txtCam1.Text) || !int.TryParse(txtCam1.Text, out result))
            {
                AlertList.Error("Bạn phải nhập Camera trước và phải là số.");
                return false;
            }

            if (string.IsNullOrEmpty(txtCam2.Text) || !int.TryParse(txtCam2.Text, out result))
            {
                AlertList.Error("Bạn phải nhập Camera sau và phải là số");
                return false;
            }

            if (string.IsNullOrEmpty(txtCam3.Text) || !int.TryParse(txtCam3.Text, out result))
            {
                AlertList.Error("Bạn phải nhập Camera sau và phải là số");
                return false;
            }

            if (string.IsNullOrEmpty(txtCam4.Text) || !int.TryParse(txtCam4.Text, out result))
            {
                AlertList.Error("Bạn phải nhập Camera sau và phải là số");
                return false;
            }

            if (rbDataServer.Checked && string.IsNullOrEmpty(txtDataServer.Text))
            {
                AlertList.Error("Bạn phải nhập IP máy chủ lưu trữ hình ảnh.");
                return false;
            }

            if (rbLocalDrive.Checked && string.IsNullOrEmpty(cbDrives.Text))
            {
                AlertList.Error("Bạn phải chọn ổ đĩa máy chủ lưu trữ hình ảnh.");
                return false;
            }

            if (cmbCardReaderVao.SelectedItem == null)
            {
                AlertList.Error("Bạn phải chọn thiết bị đọc thẻ.");
                return false;
            }

            return true;
        }

        #endregion

        protected void Insert()
        {
            try
            {
                var modelFirst = new ConfigrationCamera
                {
                    Id = Guid.NewGuid(),
                    ComputerName = _computerName,
                    Server = txtServer.Text,
                    UserID = txtuserId.Text,
                    Password = txtPassword.Text,
                    ServerData = (rbDataServer.Checked) ? txtDataServer.Text : cbDrives.Text,
                    Cam1 = int.Parse(txtCam1.Text),
                    Cam2 = int.Parse(txtCam2.Text),
                    Cam3 = int.Parse(txtCam3.Text),
                    Cam4 = int.Parse(txtCam4.Text),
                    CardReader = ((MdDevice)cmbCardReaderVao.SelectedItem).Name +"|||"+ ((MdDevice)cmbCardReaderRa.SelectedItem).Name,
                    OnLAN = rbDataServer.Checked,
                    Created = DateTime.Now,
                    CreatedBy = Constants.CurrentUser,
                    Modified = DateTime.Now,
                    ModifiedBy = Constants.CurrentUser
                };
                _configCameraService.Create(modelFirst);

                AlertList.Information("Thiết lập thành công.");
                this.Close();
            }
            catch (Exception ex)
            {
                AlertList.Error("Lỗi phát sinh khi tạo mới dữ liệu.");
            }
        }

        #region Edit

        protected void Edit(string name)
        {
            try
            {
                var itemFirst = _configCameraService.ToList().ToList().Where(p => p.ComputerName.Equals(name)).ToList();
                if (itemFirst[0] != null)
                {
                    itemFirst[0].ComputerName = _computerName;
                    itemFirst[0].Server = txtServer.Text;
                    itemFirst[0].UserID = txtuserId.Text;
                    itemFirst[0].Password = txtPassword.Text;
                    itemFirst[0].ServerData = (rbDataServer.Checked) ? txtDataServer.Text : cbDrives.Text;
                    itemFirst[0].Cam1 = int.Parse(txtCam1.Text);
                    itemFirst[0].Cam2 = int.Parse(txtCam2.Text);
                    itemFirst[0].Cam3 = int.Parse(txtCam3.Text);
                    itemFirst[0].Cam4 = int.Parse(txtCam4.Text);
                    //itemFirst[0].CardReader = ((MdDevice)cmbCardReaderVao.SelectedItem).Name;
                    itemFirst[0].CardReader = ((MdDevice) cmbCardReaderVao.SelectedItem).Name + "|||" +
                                              ((MdDevice) cmbCardReaderRa.SelectedItem).Name;
                    itemFirst[0].Modified = DateTime.Now;
                    itemFirst[0].ModifiedBy = Constants.CurrentUser;
                    itemFirst[0].OnLAN = rbDataServer.Checked;
                    _configCameraService.Update(itemFirst[0]);
                }

                AlertList.Information("Thiết lập thành công.");
                this.Close();

            }
            catch (Exception)
            {
                AlertList.Error("Lỗi phát sinh khi thiết lập dữ liệu.");
            }

        }

        #endregion

        private void DeleteData(string name)
        {
            try
            {
                var itemFirst = _configCameraService.ToList().ToList().Where(p => p.ComputerName.Equals(name)).ToList();
                foreach (ConfigrationCamera item in itemFirst)
                {
                    var it = _configCameraService.Detail(item.Id);
                    _configCameraService.Delete(it);
                }

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            var items = _configCameraService.ToList().ToList().Where(p => p.ComputerName.Contains(_computerName)).ToList();

            if (items.Count == 1)
            {
                if (Validator())
                {
                    Edit(_computerName);
                }
            }
            else if (items.Count <= 0)
            {
                if (Validator())
                {
                    Insert();
                }
            }
            else
            {
                DeleteData(_computerName);
                if (Validator())
                {
                    Insert();
                }
            }
        }

        private void frmConfigCamera_Load(object sender, EventArgs e)
        {

            var items = _configCameraService.ToList().ToList().Where(p => p.ComputerName.Contains(_computerName)).ToList();
            if (items.Count > 0)
            {
                txtServer.Text = items[0].Server;
                txtuserId.Text = items[0].UserID;
                txtPassword.Text = items[0].Password;
                if (items[0].OnLAN == true)
                {
                    rbDataServer.Checked = true;
                    txtDataServer.Text = items[0].ServerData;
                }
                else
                {
                    rbLocalDrive.Checked = true;
                    cbDrives.Text = items[0].ServerData;
                }
                txtCam1.Text = items[0].Cam1.ToString();
                txtCam2.Text = items[0].Cam2.ToString();
                txtCam3.Text = items[0].Cam3.ToString();
                txtCam4.Text = items[0].Cam4.ToString();
                cmbCardReaderVao.SelectedItem = _rawinput.MdDevices.FirstOrDefault(p => p.Name.Equals(items[0].CardReader));
            }
        }

        private void btLogin_Click(object sender, EventArgs e)
        {
            this.axLiveX1.IpAddress = txtServer.Text;
            this.axLiveX1.CommandPort = System.Convert.ToInt32("4550");
            this.axLiveX1.DataPort = System.Convert.ToInt32("5550");
            this.axLiveX1.AudioDataPort = System.Convert.ToInt32("6550");
            this.axLiveX1.DisablePWD = true;
            this.axLiveX1.UserName = txtuserId.Text;
            this.axLiveX1.Password = txtPassword.Text;
            this.axLiveX1.DefaultCam = 1;
            this.axLiveX1.PlayX();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.axLiveX1.ShowCamMenuX();
        }

        private void LoadCardReader()
        {
            //int i = 0;
            foreach (MdDevice item in _rawinput.MdDevices)
            {
                //i++;
                cmbCardReaderVao.Items.Add(item);
            }

            foreach (MdDevice item in _rawinput.MdDevices)
            {
                //i++;
                cmbCardReaderRa.Items.Add(item);
            }
        }

        private void LoadDrivers()
        {
            string[] drives = System.IO.Directory.GetLogicalDrives();

            foreach (string str in drives)
            {
                cbDrives.Items.Add(str);
            }
        }

        private void rbDataServer_CheckedChanged_1(object sender, EventArgs e)
        {
            if (rbDataServer.Checked)
            {
                txtDataServer.Enabled = true;
            }
            else
            {
                txtDataServer.Enabled = false;
            }
        }

        private void rbLocalDrive_CheckedChanged(object sender, EventArgs e)
        {
            if (rbLocalDrive.Checked)
            {
                cbDrives.Enabled = true;
            }
            else
            {
                cbDrives.Enabled = false;
            }
        }
    }
}